package com.dts.yjnb.service.service.impl;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

import com.dts.common.core.domain.model.LoginUser;
import com.dts.common.core.page.TableDataInfo;
import com.dts.common.exception.ServiceException;
import com.dts.common.utils.SecurityUtils;
import com.dts.yjnb.service.domainDto.ProductDTO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dts.yjnb.service.domain.Product;
import com.dts.yjnb.service.mapper.ProductMapper;
import com.dts.yjnb.service.service.IProductService;

import javax.xml.crypto.Data;

/**
 * 产品 服务层实现
 *
 * @author dts
 */
@Service
public class ProductServiceImpl implements IProductService
{
    private static final Logger log = LoggerFactory.getLogger(ProductServiceImpl.class);
    @Autowired
    private ProductMapper productMapper;

    /**
     * 产品分页查询
     *
     * @param productDTO 查询条件
     * @return 分页结果
     */
    @Override
    public TableDataInfo pageQuery(ProductDTO productDTO)
    {
        //属性拷贝（包括beginTime和endTime）
        Product product = new Product();
        BeanUtils.copyProperties(productDTO, product);

        // 开始分页
        PageHelper.startPage(productDTO.getPage(), productDTO.getPageSize());
        Page<Product> page = productMapper.pageQuery(product);

        long total = page.getTotal();
        List<Product> records = page.getResult();

        // 封装返回结果
        TableDataInfo tableDataInfo = new TableDataInfo();
        tableDataInfo.setTotal(total);
        tableDataInfo.setRows(records);

        return tableDataInfo;
    }

    /**
     * 根据ID查询产品详情
     *
     * @param id 产品ID
     * @return 产品详情
     */
    @Override
    public Product getByid(Long id) {
        // 参数校验
        if (id == null) {
            throw new ServiceException("产品ID不能为空");
        }
        
        // 查询产品详情
        Product product = productMapper.getByid(id);
        
        // 校验查询结果
        if (product == null) {
            throw new ServiceException("产品不存在");
        }
        
        return product;
    }

    /**
     * 农产品批量删除
     * @param ids
     */
    @Override
    public void deleteByids(List<Long> ids) {
        //先判断ids是否存在值,不存在则没必要访问数据库
        if (ids == null || ids.size() == 0) {
            throw new ServiceException("请选择要删除的产品");
        } else {
            //删除农产品
            Integer count = productMapper.deleteByids(ids);
            if (count == 0) {
                throw new ServiceException("删除失败，产品不存在");
            }
        }
    }

    /**
     * 批量修改产品状态
     *
     * @param ids 产品ID列表
     * @param status 状态：1上架 0下架
     */
    @Override
    public void updateStatusByids(List<Long> ids, Integer status) {
        //先判断ids是否存在值,不存在则没必要访问数据库
        if (ids == null || ids.size() == 0) {
            throw new ServiceException("请选择要操作的产品");
        }
        //校验状态参数
        if (status == null || (status != 0 && status != 1)) {
            throw new ServiceException("状态参数错误");
        }
        
        //批量修改状态
        Integer count = productMapper.updateStatusByids(ids, status);
        if (count == 0) {
            throw new ServiceException("修改失败，产品不存在");
        }
    }

    /**
     * 批量修改产品推荐状态
     *
     * @param ids 产品ID列表
     * @param isRecommend 推荐状态：1推荐 0不推荐
     */
    @Override
    public void updateRecommendByids(List<Long> ids, Integer isRecommend) {
        //先判断ids是否存在值,不存在则没必要访问数据库
        if (ids == null || ids.size() == 0) {
            throw new ServiceException("请选择要操作的产品");
        }
        //校验推荐状态参数
        if (isRecommend == null || (isRecommend != 0 && isRecommend != 1)) {
            throw new ServiceException("推荐状态参数错误");
        }
        
        //批量修改推荐状态
        Integer count = productMapper.updateRecommendByids(ids, isRecommend);
        if (count == 0) {
            throw new ServiceException("修改失败，产品不存在");
        }
    }

    /**
     * 产品新增
     *
     * @param productDTO 产品信息
     */
    @Override
    public void add(ProductDTO productDTO) {
        // 参数校验
        if (productDTO == null) {
            throw new ServiceException("产品信息不能为空");
        }
        if (productDTO.getName() == null || productDTO.getName().isEmpty()) {
            throw new ServiceException("产品名称不能为空");
        }
        if (productDTO.getCategoryId() == null) {
            throw new ServiceException("产品分类不能为空");
        }
        if (productDTO.getPrice() == null) {
            throw new ServiceException("产品价格不能为空");
        }
        //获取当前用户信息
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // DTO转换为实体类
        Product product = new Product();
        BeanUtils.copyProperties(productDTO, product);

        //当前用户修改
        product.setUpdateBy(loginUser.getUsername());
        log.info("当前用户{}",loginUser.getUsername());
        // 执行新增
        Integer count = productMapper.add(product);
        
        // 校验新增结果
        if (count == 0) {
            throw new ServiceException("新增失败");
        }
    }

    /**
     * 产品编辑
     *
     * @param productDTO 产品信息
     */
    @Override
    public void update(ProductDTO productDTO) {
        // 参数校验
        if (productDTO == null || productDTO.getId() == null) {
            throw new ServiceException("产品ID不能为空");
        }
        //获取当前用户信息
        LoginUser loginUser = SecurityUtils.getLoginUser();

        // DTO转换为实体类
        Product product = new Product();
        BeanUtils.copyProperties(productDTO, product);
        product.setUpdateBy(loginUser.getUsername());
        product.setUpdateTime(new Date());

        // 执行更新
        Integer count = productMapper.update(product);
        
        // 校验更新结果
        if (count == 0) {
            throw new ServiceException("修改失败，产品不存在");
        }
    }

}
